今天來解YKL34(UVA10101):Bangla Numbers
'kuti' (10000000), 'lakh' (100000), 'hajar' (1000), 'shata' (100)
假設數字:23764
從數字尾部開始,我們先取三位數字。764 可以被分為 7 shata 和 64,即「7 百 64」。
然後看剩下的數字:23,即「23 千」。
結果是:23 hajar 7 shata 64。
處理 kuti 的部分:
將數字先除以 10000000(kuti),提取出千萬位的數字部分 kuti_part。
如果 kuti_part > 0,那麼對這部分進行遞迴處理,並加上 kuti 單位。
剩餘的數字保存在 num 變量中。
處理剩下的部分:
從單位最大的開始,遍歷 places,對每一個單位:
如果數字大於等於這個單位的數值,計算出應該有多少個該單位(例如:num / divisor),然後把對應的結果加到 result 字串中。
將處理完該單位後的餘數繼續存到 num 中,並處理下一個單位。
這個過程是從最大的單位處理到最小的單位,例如從 lakh 處理到 shata。
處理剩餘數字:
如果經過所有單位的處理之後,還有剩下的數字 num > 0,直接將剩餘數字加到結果中(這部分通常是100以內的數字,無需單位)
#include <iostream>
#include <vector>
using namespace std;
string convert_to_bangla(long long num) {
vector<pair<string, long long>> places = {
{"kuti", 10000000}, {"lakh", 100000}, {"hajar", 1000}, {"shata", 100}
};
if (num == 0) return "0";
string result = "";
long long kuti_part = num / 10000000;
num %= 10000000;
if (kuti_part > 0) {
result += convert_to_bangla(kuti_part) + " kuti";
}
for (auto &place : places) {
long long divisor = place.second;
if (num >= divisor) {
if(result.size() != 0){
result += " ";
}
result += to_string(num / divisor) + " " + place.first;
num %= divisor;
}
}
if (num > 0) {
if(result.size() != 0){
result += " ";
}
result += to_string(num);
}
return result;
}
int main() {
long long num;
int cases = 1;
while (cin >> num) {
string result = convert_to_bangla(num);
cout.width(4);
cout << cases;
cout << ". " << result << endl;
cases++;
}
return 0;
}
這是我第一次參加鐵人賽,也是第一次寫這種文章,雖然寫得很像自己的筆記。
但經過這次的練習,讓我強迫自己每天練習一題,提升了一點coding的技巧。
最後還是沒也達到30天內練完48題的目標,有一點遺憾,如果有機會的話,我會找時間補上。
最後的最後,謝謝大家的觀看!